function f_check_connect()
{   #kill掉mysql连接, 这个函数变量起的有点二, 主要是担心变量重名, 不想命名了, 看注释吧
    declare _h _p _r _f _F _c _s _s_ _R _m _C _t _T _d _Table _u _M _opt _info _MAX fun_name
    fun_name="f_check_connect"
    _h="${mysql_host}" #mysql master ip
    _p="${mysql_port}" #mysql 端口
    _f="${1}"          #mdl检查标志文件
    _c="${2}"          #检查的次数, 也是时间秒数
    _T="${3}"          #osc 工具
    _d="${4}"          #操作的db
    _Table="${5}"      #操作的表
    _u="${6}"          #改表的用户
    _opt="${7}"        #检查连接数, 还是活跃连接数, connect表示连接数
    _info="${8}"       #提示信息
    _C="0"             #当前连接数
    _R="0"             #保存结果, 每次检查连接数, 如果大于限制的最大值就累加, 如果持续的次数大于10就退出改表
    _m="0"             #连接数大于限制的最大值标志, 1表示大于, 0表示不大于
    _M=0               #如果开始执行的时候遇到连接太大就先释放空连接, 如果释放后还是不行就退出
    f_logging "REMAIND:${fun_name}" "master '${_h}:${_p}' 开始检查${_info}" "1" "0" "0"

    if [ "${_opt}x" == "connectx" ]
    then
        _MAX="${max_threads}"
        _s="select count(*) from ${isdbp};"
        _F="${check_connect_file}"
        _s_="show global status like 'Threads_running';"
    else
        _MAX="${max_running}"
        _s="show global status like 'Threads_running';"
        _F="${check_thread_file}"
    fi
    while :  #这个循环时检查连接数和活跃连接数, 只要改表任务还存在, 就一直检查
    do
        [ ! -f "${check_thread_file}" ] && break
        [ ! -f "${osc_run_mark_file}" ] && break    #主程序标志文件不存在, 则表示改表任务已经结束, 就退出检查
        [ ! -f "${check_connect_file}" ] && break
        __="select concat(max_connect,':::',run_state) from ${t_state_task} 
            where port = ${mysql_port} and order_id = '${user_order_id}' order by id desc limit 1;"
        max_threads_run_state="$(${mysql_comm_dbadb} -NBe "${__}" 2>&1|sed '/Using a password/d')" && exe_state="${?}" || exe_state="${?}"
        [ "${exe_state}x" != "0x" ] && { f_exe_sql_to_dbadb "${__}" "f_check_connect" || true;}
        max_threads_tmp="$(awk -F::: '{print $1}' <<< "${max_threads_run_state}"|grep -P "^[1-9][0-9]{0,}$")" || true
        osc_run_state="$(awk -F::: '{print $2}' <<< "${max_threads_run_state}")" || true
        [ -n "${max_threads_tmp}" -a "${_opt}x" == "connectx" ] && _MAX="${max_threads_tmp}"
        [ "${osc_run_state}x" != "0x" -a ${_c} -ne 30 ] && sleep 10 && continue #改表不运行就不检查连接数

        for (( _t=0; _t<=${_c}; _t++ ))
        do  #这是一个检查周期, 由用户定义一个周期检查多少次, 脚本定义时100次, 就是100s
            #如果每个周期持续超过阈值, 且6个周期都如此, 就表明连接数异常, 需要kill掉改表任务
            sleep 1
            exe_state=0
            if [ "${_opt}x" == "connectx" ]
            then
                _C="$(f_exe_sql_in_mysql "${_s}" "${_h}" "${_p}" "slave")" || exe_state="${?}"
                f_exe_sql_in_mysql "${_s_}" "${_h}" "${_p}" "slave"|awk '{print $2}' >> ${max_thread_file}
            else
                _C="$(f_exe_sql_in_mysql "${_s}" "${_h}" "${_p}" "slave"|awk '{print $2}')" || exe_state="${?}"
            fi
            [ -f "${osc_run_mark_file}" ] && echo "$(date +%s) ${_C}" > ${_F} || true     #向检查标志文件写一个时间戳, 表明检查进程还活着, 目的是给守护进程检查的
            [ ${exe_state} -ne 0 ] && _m=1 && continue   #如果获取连接数信息失败, 就可能是连接数打满了, 然后获取不到
            [ "$(sed 's/[0-9]//g' <<< "${_C}")x" != "x" ] && _C=0    #获取到的连接数是空, 则置零
            if [ ${_C} -ge ${_MAX} ]
            then #大于阈值就记为_m=1
                _m=1
            else
                _m=0 && break   #如果有任何一次小于阈值就置为_m=0并结束本次检查周期
            fi
            [ ! -f "${_f}" -a ${_c} -ne 30 ] && break  #_c=30表示改表开始的时候的检查
        done

        if [ "${_m}x" == "0x" ]
        then
            _R=0 #如果检查到连接数小于è¾置的最大值就重新计数
        elif [ "${_m}x" == "1x" ]
        then #如果一个检查周期内都大于阈值, _R+1, 当_R大于等于6的时候就会kill掉改表任务
            _R="$((${_R}+1))"
            f_logging "WARN:${fun_name}" "'${_h}:${_p}' 当前${_info} ${_C}" "2" "0" "0"

            if [ "${_c}x" != "30x" ]
            then #_c!=30改表开始之后的检查任务
                f_kill_mysql_query "${_h}" "${_p}" "null" "master" "${_opt}"
            elif [ "${_c}x" == "30x" ] && [ "${_M}x" == "0x" ]
            then #_c=30改表开始之前的检查任务
                _M="1"   #清理空连接以后就将这个开关置为1, 表示下次不再kill空连接, 也作为_c=30的结束标志
                f_kill_mysql_query "${_h}" "${_p}" "null" "master" "${_opt}" && exe_state="${?}" || exe_state="${?}"
                if [ ${exe_state} -eq 0 ]
                then #如果是没有可kill的空连接, 就不进行检查了
                    continue
                fi
            fi
        fi

        if [ ${_R} -gt 5 ]
        then #_R大于5表示连接数异常了, 需要kill掉任务, 避免改表任务长时间等待不返回状态
            { echo "${_opt}" > ${has_max_process_file} && chattr +i ${has_max_process_file} || break;} || true
            f_logging "ERROR:${fun_name}" "'${_h}:${_p}' 当前${_info} 是 ${_C}, 已经持续 $((${_R}*${_c}))s 超过最大限制 ${_MAX}, 导致改表任务终止" "2" "0" "0" >&2
            f_kill_osc_process "${_T}" "${_h}" "${_p}" "${_d}" "${_Table}" "${_u}" || true
            [ "${_T}x" == "alterx" ] && break
            f_delete_tmp_table "${_T}" "${_d}" "${_Table}" "${_h}" "原因是当前${_info}太大导致改表任务终止." >&2 || true      #清理临时表
            break
        fi

        if [ ! -f "${_f}" ] || [ "${_c}x" == "30x" -a "${_M}x" == "1x" ]
        then  #检查结束的条件, 标志文件不存在, 或者_c=30 && _M=1
            break
        fi
        _M="0" #释放空连接的开关
    done

    if [ "${_m}x" == "1x" ] && [ "${_c}x" == "30x" ]
    then #直接返回异常
        return 1
    elif [ "${_c}x" == "30x" ] 
    then
        f_logging "REMAIND:${fun_name}" "master '${_h}:${_p}' 当前${_info} ${_C}" "1" "0" "0"
    fi
    [ -f "${check_connect_file}" ] && rm -f ${check_connect_file}
    [ -f "${check_thread_file}" ] && rm -f ${check_thread_file}
    [ -f "${max_thread_file}" ] && rm -f ${max_thread_file}
    f_logging "REMAIND:${fun_name}" "master '${_h}:${_p}' 检查${_info}结束" "1" "0" "0"
}

